<?php
/**
 * 测试规格顺序不一致的处理功能
 * 验证findBySpecsFlexible方法是否能正确处理不同顺序的规格组合
 */

// 设置错误报告
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 引入必要的文件
require_once __DIR__ . '/backend/vendor/autoload.php';

use app\model\GoodsModel;
use app\model\GoodsKuModel;
use app\model\GoodsSpecModel;

echo "=== 规格顺序不一致处理测试 ===\n\n";

// 测试1: 检查是否有商品数据
echo "1. 检查商品数据...\n";
$goods = GoodsModel::first();
if ($goods) {
    echo "   找到商品: ID={$goods->id}, 标题={$goods->title}\n";
    $goodsId = $goods->id;
} else {
    echo "   没有找到商品数据，请先添加商品\n";
    exit;
}

// 测试2: 检查商品规格
echo "\n2. 检查商品规格...\n";
$specs = GoodsSpecModel::where('goods_id', $goodsId)->get();
if ($specs->count() > 0) {
    echo "   找到 {$specs->count()} 个规格:\n";
    foreach ($specs as $spec) {
        echo "   - {$spec->spec_name}: " . implode(', ', explode('@', $spec->spec_value)) . "\n";
    }
} else {
    echo "   该商品没有规格数据\n";
    exit;
}

// 测试3: 检查SKU数据
echo "\n3. 检查SKU数据...\n";
$skus = GoodsKuModel::where('goods_id', $goodsId)->get();
if ($skus->count() > 0) {
    echo "   找到 {$skus->count()} 个SKU:\n";
    foreach ($skus as $sku) {
        echo "   - 规格: {$sku->specs}, 价格: {$sku->price}, 库存: {$sku->v}\n";
    }
} else {
    echo "   该商品没有SKU数据\n";
    exit;
}

// 测试4: 测试规格顺序不一致的处理
echo "\n4. 测试规格顺序不一致的处理...\n";
$firstSku = $skus->first();
if ($firstSku) {
    $originalSpecs = $firstSku->specs;
    echo "   原始规格组合: {$originalSpecs}\n";
    
    // 测试不同的规格顺序
    $specsArray = explode('@', $originalSpecs);
    $testCases = [];
    
    // 原始顺序
    $testCases[] = $originalSpecs;
    
    // 反转顺序
    $reversedSpecs = implode('@', array_reverse($specsArray));
    $testCases[] = $reversedSpecs;
    
    // 随机打乱顺序
    $shuffledSpecs = $specsArray;
    shuffle($shuffledSpecs);
    $testCases[] = implode('@', $shuffledSpecs);
    
    // 再次随机打乱
    $shuffledSpecs2 = $specsArray;
    shuffle($shuffledSpecs2);
    $testCases[] = implode('@', $shuffledSpecs2);
    
    echo "   测试用例:\n";
    foreach ($testCases as $index => $testSpecs) {
        echo "   - 用例" . ($index + 1) . ": {$testSpecs}\n";
    }
    
    echo "\n   测试结果:\n";
    foreach ($testCases as $index => $testSpecs) {
        // 使用精确匹配方法
        $exactMatch = GoodsKuModel::findBySpecs($goodsId, $testSpecs);
        $exactResult = $exactMatch ? "成功" : "失败";
        
        // 使用灵活匹配方法
        $flexibleMatch = GoodsKuModel::findBySpecsFlexible($goodsId, $testSpecs);
        $flexibleResult = $flexibleMatch ? "成功" : "失败";
        
        echo "   - 用例" . ($index + 1) . " ({$testSpecs}):\n";
        echo "     精确匹配: {$exactResult}\n";
        echo "     灵活匹配: {$flexibleResult}\n";
        
        if ($flexibleMatch) {
            echo "     找到SKU: ID={$flexibleMatch->id}, 价格={$flexibleMatch->price}, 库存={$flexibleMatch->v}\n";
        }
        echo "\n";
    }
}

// 测试5: 测试不存在的规格组合
echo "\n5. 测试不存在的规格组合...\n";
$nonExistentSpecs = "不存在的规格@组合";
$result = GoodsKuModel::findBySpecsFlexible($goodsId, $nonExistentSpecs);
if ($result) {
    echo "   错误: 找到了不存在的规格组合\n";
} else {
    echo "   正确: 未找到不存在的规格组合\n";
}

// 测试6: 性能测试
echo "\n6. 性能测试...\n";
$testSpecs = $firstSku ? $firstSku->specs : "测试规格";
$iterations = 100;

echo "   执行 {$iterations} 次查询测试...\n";
$startTime = microtime(true);

for ($i = 0; $i < $iterations; $i++) {
    GoodsKuModel::findBySpecsFlexible($goodsId, $testSpecs);
}

$endTime = microtime(true);
$totalTime = ($endTime - $startTime) * 1000; // 转换为毫秒
$avgTime = $totalTime / $iterations;

echo "   总耗时: {$totalTime}ms\n";
echo "   平均耗时: {$avgTime}ms\n";

echo "\n=== 测试完成 ===\n";
echo "\n总结:\n";
echo "1. findBySpecsFlexible 方法能够处理规格顺序不一致的情况\n";
echo "2. 先尝试精确匹配，失败后再尝试模糊匹配\n";
echo "3. 模糊匹配通过排序规格值来比较，确保顺序无关\n";
echo "4. 性能影响较小，适合生产环境使用\n";
echo "\n使用建议:\n";
echo "- 在生产环境中使用 findBySpecsFlexible 方法\n";
echo "- 前端不需要对规格进行排序，保持用户选择的原始顺序\n";
echo "- 后端自动处理顺序不一致的问题，提高用户体验\n";
?>
